import { login, resetPassword } from '../../api/user-api'

import auth from '../../views/utils/auth'

// import router from '@/router' // 路由相关的

const state = {
  token: auth.getToken(),
  // 下面三个可以根据后台来确定
  userInfo: '',
  // avatar: '',
  // introduction: '',
  roles: [] // 角色 ['admin']  /  ['editor']  必须为数组
}

// mutations 主要就是最终是更新state数据, 在这之前可以做些什么
const mutations = {
  SET_TOKEN: (state, payload) => { state.token = payload },
  SET_USERINFO: (state, payload) => { state.userInfo = payload },
  // SET_AVATAR: (state, payload) => { state.avatar = payload },
  // SET_INTRODUCTION: (state, payload) => { state.introduction = payload },
  SET_ROLES: (state, payload) => { state.roles = payload }
}

const actions = {
  // 登录actions
  login ({ commit }, userInfo) {
    return new Promise((resolve, reject) => {
      login(userInfo).then((res) => {
        // console.log(res)
        // commit('SET_TOKEN', res.data.token)
        // auth.setToken(res.data.token)
        // resolve()
        // 上面测试用
        if (res.code === 200) {
          commit('SET_TOKEN', res.data.token)
          commit('SET_USERINFO', res.data.user)
          auth.setToken(res.data)
          resolve()
        } else {
          console.log('用户密码不正确')
          reject(res.msg)
        }
      }).catch(error => {
        reject(error)
      })
    })
  },
  // 登出
  loginOut ({ commit, state }) {
    return new Promise((resolve, reject) => {
      // 测试
      commit('SET_TOKEN', '')
      commit('SET_ROLES', [])
      auth.removeToken()
      resolve()
    //   loginOut(state.token).then(() => {
    //     commit('SET_TOKEN', '')
    //     commit('SET_ROLES', [])
    //     auth.removeToken()
    //     // resetRouter()  // 重新设置路由规则
    //     resolve()
    //   }).catch(error => {
    //     reject(error)
    //   })
    })
  },
  // ?什么情况下要清空token包括本地
  resetToken ({ commit }) {
    return new Promise(resolve => {
      commit('SET_TOKEN', '')
      commit('SET_ROLES', [])
      auth.removeToken()
      resolve()
    })
  },

  // 修改密码
  get_resetPassword ({ commit }, req) {
    return new Promise((resolve, reject) => {
      resetPassword(req).then(res => {
        if (res.code === 200) {
          resolve(res)
        } else {
          reject(res)
        }
      })
    })
  }

  // 角色切换? 是根据不同的token请求后台数据
  /**
   *
   * @param {当切换role,并把切换的值为标识传过来}} role
   */
  //   changeRoles ({ commit, dispatch }, role) {
  //     return new Promise(async (resolve, reject) => {
  //       const token = role + '_token' // 本地测试简单的拼接成唯一标识 用于区别
  //       commit('SET_TOKEN', token)
  //       auth.setToken(token)
  //       // 重新发送请求获取用户的信息
  //       const { roles } = await dispatch('getInfo') // getInfo里面有做判断了
  //       const accessRoutes = await dispatch('permission/generateRoutes', roles, { root: true }) // 在这里可以直接拿?{ root: true }什么意思不懂
  //       //   accessRoutes = [{},{},{}]  返回的结果是这样的路由规则
  //       router.addRoutes(accessRoutes) // 动态渲染路由树
  //     //   dispatch('tagsview/delAllViews', null, { root: true })
  //     // 有 3 个参数, 第一个参数是其他模块的 actions 路径, 第二个是传给 actions 的数据, 如果不需要传数据, 也必须预留, 第三个参数是配置选项, 申明这个 acitons 不是当前模块的
  //     })
  //   }

}
// 为了解决不同模块命名冲突的问题，将不同模块的namespaced:true，之后在不同页面中引入getter、actions、mutations时，需要加上所属的模块名
export default {
  namespaced: true,
  state,
  mutations,
  actions
}
